package snippets;

import java.awt.Color;
import java.lang.reflect.*;

public class GetColor {

    static public void main( String[] args ) {
	Rabbit rabbit = new Rabbit();
//start extract snippet3
	setObjectColor( rabbit, Color.WHITE );
//stop extract snippet3
	if ( !rabbit.setColorCalled )
	    throw new RuntimeException();
    }

//start extract setObjectColor
    public static void setObjectColor( Object obj, Color color ) 
    {
	Class cls = obj.getClass();                                     //#1

	try {
	    Method method = cls.getMethod( "setColor",                  //#2
					   new Class[] {Color.class} );

	    method.invoke( obj, new Object[] {color} );                 //#3
	}
	catch (NoSuchMethodException ex) {                              //#4
	    throw new IllegalArgumentException(
			   cls.getName() + " does not support"
			   + "method setColor(:Color)");
	}
	catch (IllegalAccessException ex) {                             //#5
	    throw new IllegalArgumentException(
			   "Insufficient access permissions to call"
			   + "setColor(:Color) in class " + cls.getName());
	}
	catch (InvocationTargetException ex) {                          //#6
	    throw new RuntimeException(ex);
	}
    }
//stop extract setObjectColor

    static public class Rabbit {
	public boolean setColorCalled = false;

	public void setColor( Color c ) { setColorCalled = true; }
    }
}
